home *** CD-ROM | disk | FTP | other *** search
/ Aminet 44 / Aminet 44 (2001)(GTI - Schatztruhe)[!][Aug 2001].iso / Aminet / misc / emu / p-interp.lha / p-interp-0.4 / turtlegr.c < prev    next >
C/C++ Source or Header  |  2001-06-14  |  7KB  |  323 lines

  1. /*
  2.  
  3.   P-Code interpreter (to run the apple pascal system)
  4.   Copyright (C) 2000 Mario Klebsch
  5.  
  6.   This program is free software; you can redistribute it and/or modify
  7.   it under the terms of the GNU General Public License as published by
  8.   the Free Software Foundation; either version 2 of the License, or
  9.   (at your option) any later version.
  10.  
  11.   This program is distributed in the hope that it will be useful,
  12.   but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.   GNU General Public License for more details.
  15.  
  16.   You should have received a copy of the GNU General Public License
  17.   along with this program; if not, write to the Free Software
  18.   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  19.  
  20.  
  21.   $Log: turtlegr.c,v $
  22.   Revision 1.4  2001/06/06 23:14:19  mario
  23.   Turtlegraphics wird jetzt mit einem #define aktiviert
  24.  
  25.   Revision 1.3  2001/05/23 21:16:41  mario
  26.   Turtlegraphics wurde als eigener Prozess ausgelagert.
  27.  
  28.   Revision 1.2  2001/05/20 13:12:02  mario
  29.   CVS-Idents und Logs eingefügt
  30.  
  31.  
  32. */
  33.  
  34. #ifdef TURTLEGRAPHICS
  35.  
  36. #ident "$Id: turtlegr.c,v 1.4 2001/06/06 23:14:19 mario Exp $";
  37.  
  38. #include <math.h>
  39. #include <unistd.h>
  40. #include <stdio.h>
  41. #include <stdarg.h>
  42. #include <sys/types.h>
  43. #ifndef _AMIGA
  44. #include <sys/socket.h>
  45. #else
  46. #include <stdlib.h>
  47. #include <string.h>
  48. #define rint(f) floor(f+.5)
  49. #endif
  50. #include <sys/wait.h>
  51.  
  52. #include "psystem.h"
  53. #include "pcode.h"
  54. #include "Memory.h"
  55. #include "Stack.h"
  56.  
  57. static FILE *TurtleServer=NULL;
  58.  
  59. #define TURTLE_SPEEDUP
  60.  
  61. #ifdef TURTLE_SPEEDUP
  62. static Integer    CurrentTurtleX;
  63. static Integer    CurrentTurtleY;
  64. static Integer    CurrentTurtleAng;
  65. #endif
  66.  
  67. void StartTurtleServer(void)
  68. {
  69. #ifndef _AMIGA
  70.   int fd[2];
  71.   int pid;
  72.   int i;
  73.  
  74.   if (socketpair(PF_UNIX, SOCK_STREAM, 0, fd)<0)
  75.     {
  76.       perror("socketpair()");
  77.       return;
  78.     }
  79.   if ((pid=fork())<0)
  80.     {
  81.       perror("fork()");
  82.       return;
  83.     }
  84.   if (!pid)
  85.     {
  86.       if (fd[1]!=0)
  87.     {
  88.       close(0);
  89.       dup2(fd[1],0);
  90.     }
  91.       if (fd[1]!=1)
  92.     {
  93.       close(1);
  94.       dup2(fd[1],1);
  95.     }
  96.       for (i=getdtablesize();i>2;i--)
  97.     close(i);
  98.       execlp("xturtleserver", "xturtleserver", NULL);
  99.       execlp("./xturtleserver", "xturtleserver", NULL);
  100.       perror("xturtleserver");
  101.       _exit(1);
  102.     }
  103.   close(fd[1]);
  104.   TurtleServer=fdopen(fd[0], "wb+");
  105. #else
  106. system("arexxturtleserver");
  107. #endif
  108. }
  109.  
  110. void tprintf(char *format, ...)
  111. {
  112.   va_list ap;
  113.   if (!TurtleServer)
  114.     StartTurtleServer();
  115.  
  116.   if (TurtleServer)
  117.     {
  118.       va_start(ap, format);
  119.       vfprintf(TurtleServer, format, ap);
  120.       va_end(ap);
  121.       putc('\n', TurtleServer);
  122.     }
  123. }
  124.  
  125. Integer tgetint(void)
  126. {
  127.   int i=0;
  128.   char    Buffer[20];
  129.  
  130.   fflush(TurtleServer);
  131.  
  132.   for (i=0; i<19;i++)
  133.     {
  134.       Buffer[i]=getc(TurtleServer);
  135.       if (Buffer[i]=='\n')
  136.     break;
  137.     }
  138.  
  139.   Buffer[i]='\0';
  140.  
  141.   sscanf(Buffer, "%d", &i);
  142.   return ((Integer)i);
  143. }
  144.  
  145. #ifdef TURTLE_SPEEDUP
  146. void TurnTo(int Angle)
  147. {
  148.   CurrentTurtleAng=Angle;
  149.   while (CurrentTurtleAng<0)
  150.     CurrentTurtleAng+=360;
  151.   while (CurrentTurtleAng>=360)
  152.     CurrentTurtleAng-=360;
  153. }
  154. #endif
  155.  
  156. void TurtleGraphics(word EntryPoint)
  157. {
  158.   int    i;
  159.   char    func[64];
  160.   char    *p;
  161.  
  162.   i=0;
  163.   for (i=0; i<sizeof(func); i++)
  164.     if (!(func[i]=MemRdByte(EntryPoint,i)))
  165.       break;
  166.  
  167.   p=&func[16];
  168.   if (strcmp(p, "INITTURTLE")==0)
  169.     tprintf("INITTURTLE");
  170.   else if (strcmp(p, "TURN")==0)
  171.     {
  172.       Integer i=PopInteger();
  173.       tprintf("TURN %d",i);
  174. #ifdef TURTLE_SPEEDUP
  175.       TurnTo(CurrentTurtleAng+i);
  176. #endif
  177.     }
  178.   else if (strcmp(p, "TURNTO")==0)
  179.     {
  180.       Integer i=PopInteger();
  181.       tprintf("TURNTO %d",i);
  182. #ifdef TURTLE_SPEEDUP
  183.       TurnTo(i);
  184. #endif
  185.     }
  186.   else if (strcmp(p, "MOVE")==0)
  187.     {
  188.       Integer i=PopInteger();
  189.       tprintf("MOVE %d",i);
  190. #ifdef TURTLE_SPEEDUP
  191.       CurrentTurtleX+=rint(cos(CurrentTurtleAng*3.14/180)*i);
  192.       CurrentTurtleY+=rint(sin(CurrentTurtleAng*3.14/180)*i);
  193. #endif
  194.     }
  195.   else if (strcmp(p, "MOVETO")==0)
  196.     {
  197.       Integer y=PopInteger();
  198.       Integer x=PopInteger();
  199.       tprintf("MOVETO %d %d",x,y);
  200. #ifdef TURTLE_SPEEDUP
  201.       CurrentTurtleX=x;
  202.       CurrentTurtleY=y;
  203. #endif
  204.     }
  205.   else if (strcmp(p, "PENCOLOR")==0)
  206.     tprintf("PENCOLOR %d",Pop());
  207.   else if (strcmp(p, "TEXTMODE")==0)
  208.     tprintf("TEXTMODE");
  209.   else if (strcmp(p, "GRAFMODE")==0)
  210.     tprintf("GRAFMODE");
  211.   else if (strcmp(p, "FILLSCREEN")==0)
  212.     tprintf("FILLSCREEN %d",Pop());
  213.   else if (strcmp(p, "VIEWPORT")==0)
  214.     {
  215.       int yMax=PopInteger();
  216.       int yMin=PopInteger();
  217.       int xMax=PopInteger();
  218.       int xMin=PopInteger();
  219.       tprintf("VIEWPORT %d %d %d %d",xMin, xMax, yMin, yMax);
  220.     }
  221.   else if (strcmp(p, "TURTLEX")==0)
  222.     {
  223.       Pop();
  224.       Pop();
  225. #ifdef TURTLE_SPEEDUP
  226.       Push(CurrentTurtleX);
  227. #else
  228.       tprintf("TURTLEX");
  229.       Push(tgetint());
  230. #endif
  231.     }
  232.   else if (strcmp(p, "TURTLEY")==0)
  233.     {
  234.       Pop();
  235.       Pop();
  236. #ifdef TURTLE_SPEEDUP
  237.       Push(CurrentTurtleY);
  238. #else
  239.       tprintf("TURTLEY");
  240.       Push(tgetint());
  241. #endif
  242.     }
  243.   else if (strcmp(p, "TURTLEANG")==0)
  244.     {
  245.       Pop();
  246.       Pop();
  247. #ifdef TURTLE_SPEEDUP
  248.       Push(CurrentTurtleAng);
  249. #else
  250.       tprintf("TURTLEANG");
  251.       Push(tgetint());
  252. #endif
  253.     }
  254.   else if (strcmp(p, "SCREENBIT")==0)
  255.     {
  256.       Integer y=PopInteger();
  257.       Integer x=PopInteger();
  258.       tprintf("SCREENBIT %d %d",x ,y);
  259.       Push(tgetint());
  260.     }
  261.   else if (strcmp(p, "DRAWBLOCK")==0)
  262.     {
  263.       int    x;
  264.       int    y;
  265.       Integer Mode    = PopInteger();
  266.       Integer YScreen = PopInteger();
  267.       Integer XScreen = PopInteger();
  268.       Integer Height  = PopInteger();
  269.       Integer Width   = PopInteger();
  270.       Integer YSkip   = PopInteger();
  271.       Integer XSkip   = PopInteger();
  272.       Integer RowSize = PopInteger();
  273.       word Source     = Pop();
  274.  
  275.       tprintf("DRAWBLOCK %d %d %d %d %d %d %d %d",
  276.           (((XSkip+Width+7)&~7)-(XSkip&~7))>>3, XSkip&7, 0,
  277.           Width, Height, XScreen, YScreen, Mode);
  278.       for (y=0; y<Height; y++)
  279.     for (x=(XSkip&7);x<((XSkip+Width+7)&~7);x+=8)
  280.       putc(MemRdByte(Source, (y+YSkip)*RowSize+x/8), TurtleServer);
  281.     }
  282.   else if (strcmp(p, "WCHAR")==0)
  283.     {
  284.       tprintf("WCHAR %d",Pop()&0xff);
  285. #ifdef TURTLE_SPEEDUP
  286.       CurrentTurtleX += 7;
  287. #endif
  288.     }
  289.   else if (strcmp(p, "WSTRING")==0)
  290.     {
  291.       word Addr=Pop();
  292.       int  Len=MemRdByte(Addr, 0);
  293.       int  i;
  294.  
  295.       tprintf("WSTRING %d",Len);
  296.       for (i=0;i<Len; i++)
  297.     putc(MemRdByte(Addr, i+1), TurtleServer);
  298. #ifdef TURTLE_SPEEDUP
  299.       CurrentTurtleX += 7*Len;
  300. #endif
  301.     }
  302.   else if (strcmp(p, "CHARTYPE")==0)
  303.     tprintf("WCHAR %d",Pop()&0x0f);
  304.   else
  305.     XeqError(XNOTIMP);
  306.   fflush(TurtleServer);
  307. }
  308.  
  309. void GraphicsClear(void)
  310. {
  311. #ifndef _AMIGA
  312.   int status;
  313.   if (TurtleServer)
  314.     {
  315.       fclose(TurtleServer);
  316.       TurtleServer=NULL;
  317.       wait(&status);
  318.     }
  319. #endif
  320. }
  321.  
  322. #endif /* TURTLEGRAPHICS */
  323.